package com.catazzz.springbootstudy.common.rabbit;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @作者: Tao
 * @日期: 2025/1/9
 * @时间: 10:27
 * @描述: <br><pre>
 */
@Slf4j
@RestController
@RequestMapping("/rabbit")
@Api(tags = "RabbitMQ测试")
public class RabbitController {

    // 自动注入RabbitTemplate，用于发送消息
//    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 简单模式发送
     * @param routingKey 路由键，决定消息发送到哪个队列
     * @param message 消息内容，生产者要发送的消息
     */
    @ApiOperation(value = "简单模式")
    @PostMapping("/send")
    public void send(String routingKey, String message) {
        // 将消息转换并发送到指定的路由键对应的队列中
        rabbitTemplate.convertAndSend(routingKey, message);
    }

    /**
     * Work模式发送消息
     * @param routingKey 路由键，决定消息发送到哪个队列
     * @param message 消息内容，生产者要发送的消息
     */
    @PostMapping("/work")
    @ApiOperation("work 模式")
    public void sendWork(String routingKey, String message) {
        // 将消息转换并发送到指定的路由键对应的队列中
        rabbitTemplate.convertAndSend(routingKey, message);
    }

    /**
     * Fanout模式发送消息
     * @param exchange 交换机，消息发送到交换机后，交换机会将消息发送到所有绑定到该交换机的队列中
     * @param message 消息内容，生产者要发送的消息
     */
    @PostMapping("/fanout")
    @ApiOperation("fanout 模式")
    public void sendFanout(String exchange, String message) {
        rabbitTemplate.convertAndSend(exchange, "", message);
    }

    /**
     * Direct模式发送消息
     * @param exchange 交换机，消息发送到交换机后，交换机会将消息发送到绑定到该交换机的队列中
     * @param routingKey 路由键，决定消息发送到哪个队列
     * @param message 消息内容，生产者要发送的消息
     */
    @PostMapping("/direct")
    @ApiOperation("direct 模式")
    public void sendDirect(String exchange, String routingKey, String message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
    }


}
